Technote 1002

On Launching an App with a Document


ñ⁄éü

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÉtÉ@ÉCÉãÇäJÇ≠éûÇÃäTîO

Ç‹ÇΔNjǡÇΩÉTÉìÉvÉãÉRÅ[Éh

óvñÒ


DZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ≥ÇπǃÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇégǡǃì¡íËÇÃÉtÉ@ÉCÉãÇäJÇ≠ï˚ñ@DžǬǢǃâê‡ÇµÇƒÇ¢Ç‹Ç∑ÅBÇ‹ÇΩÅAäJÇ≠ÉtÉ@ÉCÉãÇÃÉ^ÉCÉvèÓïÒÇ…äÓÇ√ǢǃÅAãNìÆÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇëIëÇ∑ÇÈï˚ñ@LJíÒé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB

ëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈÇÊǧǻÉ\ÉtÉgÉEÉFÉAÇäJî≠ǵǃǢÇÈÉfÉxÉçÉbÉpÇÕÅADZÇÃÉeÉbÉNÉmÅ[ÉgÇéQçlDžǵǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈÇæÇØÇ≈ÇÕÇ»Ç≠ÅAéwíËÇÃÉtÉ@ÉCÉãÇäJÇ≠DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

DZÇÃÉeÉbÉNÉmÅ[ÉgÇÕInside Macintosh: Interapplication CommunicationÇÃÅuCreating and Sending Apple EventsÅvÇ‚Inside Macintosh: More Macintosh ToolboxÇÃÅuDesktop ManagerÅvÇÃì‡óeÇ…äÓÇ√ǢǃǢNjÇ∑ÅBÇ‹ÇΩÅAOpenDocuments Apple eventÇÕInside Macintosh: Interapplication CommunicationÇÃÅuHandling the Required Apple EventsÅvÅi4-11ÉyÅ[ÉWÅjÇ≈âê‡Ç≥ÇÍǃǢNjÇ∑ÅB


ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÉtÉ@ÉCÉãÇäJÇ≠éûÇÃäTîO

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÉtÉ@ÉCÉãÇäJÇ≠Ç…ÇÕà»â∫ÇÃéËèáÇ…è]ǢNjÇ∑ÅB

  1. ÉtÉ@ÉCÉãÇäJÇ≠ÇΩÇflÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËÇ∑ÇÈÅB
  2. ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…OpenDocuments Apple eventÇëóǡǃå©ÇÈÅB
  3. ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç≈Ç…ãNìÆÇµÇƒÇ¢Ç»Ç©Ç¡ÇΩÇÁÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÅAäJÇ≠ÉtÉ@ÉCÉãÇÃèÓïÒÇÉpÉâÉÅÅ[É^ÇΔǵǃìnÇ∑ÅB

ÉtÉ@ÉCÉãÇäJÇ≠ÇΩÇflÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËÇ∑ÇÈ

Ç∑Ç◊ǃÇÃÉtÉ@ÉCÉãÇÕÉNÉäÉGÅ[É^É^ÉCÉvÇΔÉtÉ@ÉCÉãÉ^ÉCÉvÇÃëÆê´ÇéùǡǃǢNjÇ∑ÅBÉtÉ@ÉCÉãÇäJÇ≠ÇΩÇflÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËÇ∑ÇÈÇ…ÇÕÅAÇ‹Ç∏ÉtÉ@ÉCÉãÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇéQèΔǵNjÇ∑ÅBÉtÉ@ÉCÉãÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇÕéüÇÃÇÊǧDžFSpGetInfo ()Ç≈ìæÇÁÇÍÇ‹Ç∑ÅB

err = FSpGetInfo (&spec, &fndrInfo);


ÉtÉ@ÉCÉãÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇÕfndrInfo.fdCreatorÇ…ï‘Ç≥ÇÍÇ‹Ç∑ÅB

OpenDocuments Apple eventÇëóêMÇ∑ÇÈç€ÇÃÉ^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕtypeApplSignatureÉåÉRÅ[ÉhÇçÏê¨ÇµÇƒÅAêÊíˆìæÇΩÉNÉäÉGÅ[É^É^ÉCÉvÇéwíËǵNjÇ∑ÅBéwíËÇ≥ÇÍÇΩÉNÉäÉGÅ[É^É^ÉCÉvÇ…äYìñÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ãNìÆÇµÇƒÇ¢Ç»Ç¢èÍçáÇÕAESend ()Ç™ÉGÉâÅ[Çï‘ǵNjÇ∑ÇÃÇ≈ÅAç°ìxÇÕÉNÉäÉGÅ[É^É^ÉCÉvÇå≥Ç…ÅAÉ}ÉEÉìÉgÇ≥ÇÍǃǢÇÈÉ{ÉäÉÖÅ[ÉÄÇ©ÇÁǪÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇéùÇ¡ÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇíTǵèoǵNjÇ∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇéwíËǵǃÉtÉ@ÉCÉãÇäJÇ≠

ópìrÇ…ÇÊǡǃÇÕÅAÉNÉäÉGÅ[É^É^ÉCÉvÇΔàŸÇ»ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÉtÉ@ÉCÉãÇäJÇ´ÇΩǢDZÇΔǙdžÇËÇ‹Ç∑ÅBó·Ç¶ÇŒÅAÇ∑Ç◊ǃÇÃÉeÉLÉXÉgÉtÉ@ÉCÉãÇñ≥èåèÇ…ClarisWorksÇ≈äJÇ≠èÍçáǙǪǧÇ≈Ç∑ÅBDZÇÃÇÊǧǻéûÇÕé©ï™ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç…ÉtÉ@ÉCÉãÉ^ÉCÉvÇÉNÉäÉGÅ[É^É^ÉCÉvÇ÷É}ÉbÉvÇ∑ÇÈä÷êîÇê›ÇØÇƒÅAFSpGetInfo ()ÇÃåãâ ÇÃë„ÇÌÇËÇ…égǶnjâåàǵNjÇ∑ÅBà»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÕDZÇÃÇÊǧǻÉ}ÉbÉsÉìÉOä÷êîÇÃàÍó·Ç≈Ç∑ÅB

LaunchTheDocumentÇ≈óòópÇ≈Ç´ÇÈÉ}ÉbÉsÉìÉOä÷êîÇ≈Ç∑ÅB

void MyMapCreator (FSSpec *document, OSType type, OSType *creator)
{
if (type == 'TEXT')
*creator = 'BOBO'; /* ÉeÉLÉXÉgÉtÉ@ÉCÉãÇÕÇ∑Ç◊ǃClarisWorks
ÅiÉNÉäÉGÅ[É^É^ÉCÉv = 'BOBO'ÅjÇ≈äJÇ≠ */
}


è„ãLÇÃÉ}ÉbÉsÉìÉOä÷êîÇÕ3ǬÇÃÉpÉâÉÅÅ[É^ÇéÛÇØïtÇØÇ‹Ç∑ÅBFSSpecÉåÉRÅ[ÉhÇÕäJÇ≠ÉtÉ@ÉCÉãÇéwǵNjÇ∑ÅBFSSpecÉåÉRÅ[ÉhÇÕä÷êîì‡ïîÇ≈ÉtÉ@ÉCÉãèÓïÒÇ™ïKóvDžǻǡÇΩèÍçáÇ…égópǵNjÇ∑ÅBtypeÇΔcreatorÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇΔÉNÉäÉGÅ[É^É^ÉCÉvÇ≈Ç∑ÅBÉ}ÉbÉsÉìÉOä÷êîÇégǶnjÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËÇ∑ÇÈç€ÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇó\ÇflïœçXÇ∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅBè„ãLÇÃó·Ç≈ÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇ™'TEXT'Ç≈džÇÍÇŒClarisWorksÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇ…É}ÉbÉvÇ≥ÇÍÅAÉeÉLÉXÉgÉtÉ@ÉCÉãDžǬǢǃÇÕLaunchTheDocumentÇ™ClarisWorksÇåƒÇ—èoǵNjÇ∑ÅBDZÇÃÉeÉbÉNÉmÅ[ÉgÇÃç≈å„Ç…ÇÕè„ãLÇÃÉRÅ[ÉhÇä‹ÇflÇΩÉTÉìÉvÉãÉRÅ[ÉhÇÇ‹ÇΔÇflǃǢNjÇ∑ÅB

OpenDocuments Apple eventÇëóÇÈ

Inside Macintosh: Interapplication CommunicationÅi4-13ÉyÅ[ÉWÅjÇ…ãLèqÇ≥ÇÍǃǢÇÈÇÊǧDžÅAOpenDocuments Apple eventÇÕ1ǬÇÃïKê{ÉpÉâÉÅÅ[É^ǙdžÇËÇ‹Ç∑ÅBDZÇÃÉpÉâÉÅÅ[É^ÇÕäJÇ≠ÉtÉ@ÉCÉãÇÃAliasÉåÉRÅ[ÉhÇÃîzóÒÇ≈Ç∑ÅBà»â∫Ç…OpenDocuments Apple eventÇÃëóêMéËèáÇãLç⁄ǵǃǢNjÇ∑ÅB

Ç‹Ç∏ÅAÉ^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉAÉhÉåÉXÉåÉRÅ[ÉhÅitarget_descÅjÇçÏê¨ÇµÇ‹Ç∑ÅBÉAÉhÉåÉXÉåÉRÅ[ÉhÇ…ÇÕfndrInfo.fdCreatorÇ≈ìæÇΩÉNÉäÉGÅ[É^É^ÉCÉvÇégǢNjÇ∑ÅB

err = AECreateDesc (typeApplSignature, (Ptr) &fndrInfo.fdCreator,
sizeof (OSType), &target_desc);


Apple eventÅithe_apple_eventÅjÇçÏê¨Ç∑ÇÈç€ÇÕÅAè„ãLÇÃÉAÉhÉåÉXÉåÉRÅ[ÉhÇéwíËǵNjÇ∑ÅB

err = AECreateAppleEvent (kCoreEventClass, kAEOpenDocuments,
&target_desc, kAutoGenerateReturnID, kAnyTransactionID,
&the_apple_event);


éüÇ…ÅAäJÇ≠ÉtÉ@ÉCÉãÇÃAliasÉåÉRÅ[ÉhÇÃîzóÒÇçÏê¨ÇµÇ‹Ç∑ÅBÉtÉ@ÉCÉãÇ1ǬǵǩäJǩǻǢDžLJä÷ÇÌÇÁÇ∏ÅAOpenDocuments Apple eventÇ…ÇÕîzóÒÇìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃèÍçáÇÕ1ǬÇÃAliasÉåÉRÅ[ÉhÇä‹ÇfiîzóÒÇ…Ç»ÇËÇ‹Ç∑ÅB

Ç‹Ç∏ÅAîzóÒÇêVãKçÏê¨ÇµÇ‹Ç∑Åifiles_listÅjÅB

err = AECreateList (NULL, 0, false, &files_list);


éüÇ…descriptorÉåÉRÅ[ÉhÅifile_descÅjÇΔÉtÉ@ÉCÉãÅithe_fileÅjÇÃAliasÇçÏê¨ÇµÇ‹Ç∑ÅB

err = NewAlias (NULL, &the_file, &the_alias);
HLock ((Handle) the_alias);
err = AECreateDesc (typeAlias, (Ptr) (*the_alias),
GetHandleSize ((Handle) the_alias), &file_desc);
HUnlock ((Handle) the_alias);


ǪǵǃÅAAliasÉåÉRÅ[ÉhÇä‹ÇÒÇædescriptorÉåÉRÅ[ÉhÅifile_descÅjÇîzóÒÅifiles_listÅjÇ…í«â¡ÇµÇ‹Ç∑ÅB

err = AEPutDesc (&files_list, 0, &file_desc);


DZÇÍÇ≈Apple eventÅithe_apple_eventÅjÇΔÉtÉ@ÉCÉãÇÃAliasÉåÉRÅ[ÉhÇä‹ÇÒÇæîzóÒÅifiles_listÅjÇ™Ç≈ǴNjǵÇΩÇÃÇ≈ÅAîzóÒÇApple eventÅithe_apple_eventÅjÇÃÉpÉâÉÅÅ[É^ÇΔǵǃìnǵNjÇ∑ÅB

err = AEPutParamDesc (&the_apple_event, keyDirectObject, &files_list);


OpenDocuments Apple eventÇÕDZÇÍÇ≈Ç≈Ç´è„Ç™ÇËÇ≈Ç∑ÅBdžÇΔÇÕÉ^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëóÇÈÇæÇØÇ≈Ç∑ÅB

err = AESend (&the_apple_event, &the_reply, kAENoReply,
kAENormalPriority, kNoTimeOut, NULL, NULL);



ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ãNìÆÇµÇƒÇ¢Ç»Ç¢èÍçá

É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ãNìÆÇµÇƒÇ¢Ç»Ç¢ÇΔÅAAESend ()ÇÕconnectionInvalidÇï‘ǵNjÇ∑ÅBDZÇÍÇÕéwíËÇ≥ÇÍÇΩÉNÉäÉGÅ[É^É^ÉCÉvÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Process ManagerÇ…ìoò^Ç≥ÇÍǃǢǻǢÇΔåæÇ§Ç±ÇΔÇ≈Ç∑ÅBDZÇÃèÍçáÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ≥ÇπÇÈÇ…ÇÕPBDTGetAPPL ()ÇégǡǃÅAÉ}ÉEÉìÉgÇ≥ÇÍǃǢÇÈÉ{ÉäÉÖÅ[ÉÄÇ©ÇÁÉNÉäÉGÅ[É^É^ÉCÉvÇ…äYìñÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËǵNjÇ∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËÇ∑ÇÈÇ…ÇÕà»â∫ÇÃÇÊǧǻÉRÅ[ÉhÇé¿çsǵNjÇ∑ÅB

HVolumeParam vol_pb;
DTPBRec desktop_pb;
FSSpec application;
vol_pb.ioNamePtr = NULL;
err = fnfErr; /* ÉfÉtÉHÉãÉgÇÃíl */
vol_pb.ioNamePtr = NULL;

/* É}ÉEÉìÉgÇ≥ÇÍǃǢÇÈÉ{ÉäÉÖÅ[ÉÄDžǬǢǃ, 1, 2, ... */

for (vol_pb.ioVolIndex = 1;
PBHGetVInfoSync((HParmBlkPtr) &vol_pb) == noErr;
vol_pb.ioVolIndex++) {

  /* PBHGetVolParmsÇégópǵǃÉçÅ[ÉJÉãÉ{ÉäÉÖÅ[ÉÄÇ≈džÇÈDZÇΔÇämîF */

  param_pb.ioVRefNum = vol_pb.ioVRefNum;
  if (PBHGetVolParmsSync((HParmBlkPtr)&param_pb) == noErr &&
  volinfo.vMServerAdr == 0) {

    /* PBDTGetPathÇ≈É{ÉäÉÖÅ[ÉÄÇÃÉfÉXÉNÉgÉbÉvÉtÉ@ÉCÉãÇì¡íËÇ∑ÇÈ */

    desktop_pb.ioCompletion = NULL;
    desktop_pb.ioVRefNum = vol_pb.ioVRefNum;
    desktop_pb.ioNamePtr = NULL;
    desktop_pb.ioIndex = 0;
    if (PBDTGetPath(&desktop_pb) == noErr) {
      desktop_pb.ioFileCreator = app_creator_bytes;
      desktop_pb.ioNamePtr = application.name;
      if (PBDTGetAPPLSync(&desktop_pb) == noErr) {
        application.vRefNum = vol_pb.ioVRefNum;
        application.parID = desktop_pb.ioAPPLParID;

        /* ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ì¡íËÇ≈ǴNjǵÇΩ */

        err = noErr;
        break;
      }
    }
  }
}


íçÅF
è„ãLÇÃÉRÅ[ÉhÇÕî‰ärìIíPèÉÇ»åüçıï˚éÆÇ≈Ç∑ÅBÉCÉWÉFÉNÉgÇ≥ÇÍǃǢÇÈÉfÉBÉXÉNÇñ≥éãǵÇΩÇËÅAì¡íËÇÃÉ{ÉäÉÖÅ[ÉÄÇóDêÊÇ∑ÇÈÇÊǧDžâ¸ëPÇÇ∑ÇÈÇÃLJǢǢǩLJǵÇÍÇ‹ÇπÇÒÅBDZÇÃÉRÅ[ÉhÇÕÉçÅ[ÉJÉãÉ{ÉäÉÖÅ[ÉÄÅiPBHGetVolParms ()Ç≈ÉçÅ[ÉJÉãÉ{ÉäÉÖÅ[ÉÄÇ≈džÇÈDZÇΔÇämîFÅjÇÃÇ›ÇåüçıǵNjÇ∑ÅBDZÇÃÉeÉbÉNÉmÅ[ÉgÇÃç≈å„DždžÇÈÇ‹ÇΔNjǡÇΩÉTÉìÉvÉãÉRÅ[ÉhÇ≈ÇÕÉIÉvÉVÉáÉìÇ≈ÉçÅ[ÉJÉãÉ{ÉäÉÖÅ[ÉÄÇ…ë±Ç¢ÇƒÅAÉlÉbÉgÉèÅ[ÉNÉ{ÉäÉÖÅ[ÉÄÇåüçıǵNjÇ∑ÅB



ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈ

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇì¡íËǵÇΩÇÁÅAAESend ()Ç≈égÇ¡ÇΩÉpÉâÉÅÅ[É^ÇLaunchApplication ()Ç™éÛÇØïtÇØÇÈÉ^ÉCÉvÇ…ïœä∑ǵNjÇ∑ÅBÉ^ÉCÉvÇïœä∑Ç∑ÇÈÇ…ÇÕà»â∫ÇÃÇÊǧDžAECoerceDesc ()ÇåƒÇ—èoǵǃÅAtypeAppParametersÇéwíËǵNjÇ∑ÅB

err = AECoerceDesc(&the_apple_event, typeAppParameters, &parameter_desc);


É^ÉCÉvÇïœä∑ǵÇΩÇÁÅAdžÇΔÇÕLaunchApplication ()ÇÃÉpÉâÉÅÅ[É^ÉuÉçÉbÉNÇñÑÇflǃǢǴNjÇ∑ÅB

launch_pb.launchBlockID = extendedBlock;
launch_pb.launchEPBLength = extendedBlockLen;
launch_pb.launchFileFlags = 0;
launch_pb.launchControlFlags =
  launchContinue + launchNoFileFlags;
launch_pb.launchAppSpec = &application;

/* launchAppParametersÇÕÉ|ÉCÉìÉ^ÇéÛÇØïtÇØÇÈÇÃÇ≈ÅA
dataHandleÇÉçÉbÉNǵǃéQèΔǵNjÇ∑ */
HLock ((Handle) parameter_desc.dataHandle);
launch_pb.launchAppParameters =
  (AppParametersPtr) (*parameter_desc.dataHandle);
err = LaunchApplication(&launch_pb);
HUnlock ((Handle) parameter_desc.dataHandle);



É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Apple eventÇ…ëŒâûǵǃǢǻǢèÍçá

É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Apple eventÇ…ëŒâûǵǃǢǻǢèÍçáÅiSystem 7.xà»ëOÅjÅAApple Event ManagerÇÕé©ìÆìIÇ…ãåéÆÇÃÉâÉìÉ`ÉpÉâÉÅÅ[É^ÇégǡǃÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇ‹Ç∑ÅBǵǩǵÅASystem 6ÇΔMultiFinderÇ™óòópǵǃǢÇΩ'mstr'ÇΔ'mst#'ÉäÉ\Å[ÉXÇÕLJǧÉTÉ|Å[ÉgÇ≥ÇÍǃǢǻǢÇÃÇ≈ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç≈Ç…ãNìÆÇµÇƒÇ¢ÇÈèÍçáÇÕÉtÉ@ÉCÉãÇäJÇ≠DZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅB


Ç‹ÇΔNjǡÇΩÉTÉìÉvÉãÉRÅ[Éh

à»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÕDZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈è–âÓÇ≥ÇÍÇΩÉRÅ[ÉhÇ1ǬDžNjÇΔÇflÇΩï®Ç≈Ç∑ÅB

íçÅF
çÏé“ÇÕà»â∫ÇÃÉRÅ[ÉhÇMPW CÅAMPW PPCÅASymantec CÅAMrCÅACodeWarrior CÇ≈ÉRÉìÉpÉCÉãÉeÉXÉgÇçsǢNjǵÇΩÅBÇ‹ÇΩÅASystem 7.0à»ç~DžǮǢǃÉoÉOÇ™ñ≥Ç¢ÇΔämêMǵǃǢNjÇ∑ÅB


/* File SendOpen.c

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÉtÉ@ÉCÉãÇäJÇ≠ÉTÉìÉvÉãÉRÅ[ÉhÅB

by John Montbriand, 1995.

Copyright (C) 1995 by Apple Computer, Inc. All Rights Reserved.*/

#include <Types.h>
#include <QuickDraw.h>
#include <Fonts.h>
#include <Windows.h>
#include <TextEdit.h>
#include <Dialogs.h>
#include <Menus.h>
#include <AppleEvents.h>
#include <StandardFile.h>
#include <Files.h>
#include <Errors.h>
#include <Aliases.h>

/* MapCreatorProcsÇ≈ÇÕÉ}ÉbÉsÉìÉOä÷êîÇéwíËÇ≈Ç´Ç‹Ç∑ÅBÉ}ÉbÉsÉìÉOä÷êî
ÇÕ*creatorÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇïœçXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB*creatorÇ
ïœçXǵǻǩǡÇΩèÍçáÇÕå≥ÇÃÉNÉäÉGÅ[É^É^ÉCÉvǙǪÇÃNjNjégópÇ≥ÇÍÇ‹Ç∑ÅB */

typedef void (*MapCreatorProc) (FSSpec *document, OSType type,
OSType *creator);

/* LaunchTheDocumentÇÕéwíËÇÃÉtÉ@ÉCÉãÇäJDZǧÇΔǵNjÇ∑ÅBïKóvÇ≈džÇÍÇŒ
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇ‹Ç∑ÅBïKóvÇ»ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™å©Ç¬Ç©ÇÁǻǢ
èÍçáÇÕfnfErrÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅBÇ‹ÇΩÅAÉlÉbÉgÉèÅ[ÉNè„ÇÃÉ{ÉäÉÖÅ[ÉÄÇÃ
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇ∑ÇÈǩǫǧǩÇÕuse_remote_appsÇ≈éwíËǵNjÇ∑ÅB
É}ÉbÉsÉìÉOä÷êîÇéwíËÇ∑ÇÈDZÇΔLJâ¬î\Ç≈Ç∑ÅB */

OSErr LaunchTheDocument (FSSpec *document, Boolean use_remote_apps,
MapCreatorProc remap) {
	OSErr err;
	AEAddressDesc target_desc; // É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉì
	AEDescList files_list;
	AEDesc file_desc, parameter_desc;
	AppleEvent the_apple_event;
	AppleEvent the_reply;
	AliasHandle the_alias;
	FInfo fndrInfo;
	OSType app_creator_bytes;
	LaunchParamBlockRec launch_pb;

	/* ÉåÉRÅ[ÉhÇÇ∑Ç◊ǃèâä˙âªÇ∑ÇÈ */

	AECreateDesc (typeNull, NULL, 0, &target_desc);
	AECreateDesc (typeNull, NULL, 0, &files_list);
	AECreateDesc (typeNull, NULL, 0, &file_desc);
	AECreateDesc (typeNull, NULL, 0, &the_apple_event);
	AECreateDesc (typeNull, NULL, 0, &the_reply);
	AECreateDesc (typeNull, NULL, 0, &parameter_desc);
	the_alias = NULL;

	/* ÉtÉ@ÉCÉãÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇìæÇÈ */

	err = FSpGetFInfo (document, &fndrInfo);
	if (err != noErr)
		goto launch_the_document_termination;

	/* ïKóvÇ≈džÇÍÇŒÉ}ÉbÉsÉìÉOä÷êîÇåƒÇ—èoÇ∑ */

	app_creator_bytes = fndrInfo.fdCreator;
	if (remap != NULL)
		remap (document, fndrInfo.fdType, &app_creator_bytes);

	/* OpenDocuments Apple eventÇêVãKçÏê¨Ç∑ÇÈ */

	err = AECreateDesc (typeApplSignature, (Ptr) &app_creator_bytes,
	      sizeof (OSType), &target_desc);
	if (err != noErr)
		goto launch_the_document_termination;
	err = AECreateAppleEvent (kCoreEventClass, kAEOpenDocuments,
	      &target_desc, kAutoGenerateReturnID,
	kAnyTransactionID, &the_apple_event);
	if (err != noErr)
		goto launch_the_document_termination;

	/* äJÇ≠ÉtÉ@ÉCÉãÇîzóÒÇ…ì¸ÇÍǃçÏê¨ÇµÇ‹Ç∑ */

	err = AECreateList (NULL, 0, false, &files_list);
	if (err != noErr)
		goto launch_the_document_termination;
	err = NewAlias (NULL, document, &the_alias);
	if (err != noErr)
		goto launch_the_document_termination;
	HLock ((Handle) the_alias);
	err = AECreateDesc (typeAlias, (Ptr) (*the_alias),
	      GetHandleSize ((Handle) the_alias), &file_desc);
	HUnlock ((Handle) the_alias);
	if (err != noErr)
		goto launch_the_document_termination;
	err = AEPutDesc (&files_list, 0, &file_desc);
	if (err != noErr)
		goto launch_the_document_termination;

	/* OpenDocuments Apple eventÇ…îzóÒÇí«â¡Ç∑ÇÈ */

	err = AEPutParamDesc (&the_apple_event, keyDirectObject,
	      &files_list);
	if (err != noErr)
		goto launch_the_document_termination;

	/* Apple eventÇëóêMÇ∑ÇÈ */

	err = AESend (&the_apple_event, &the_reply, kAENoReply,
	      kAENormalPriority, kNoTimeOut, NULL, NULL);


	/* ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ãNìÆÇµÇƒÇ¢Ç»Ç¢èÍçáÇÃèàóù */

	if (err == connectionInvalid) {
		HVolumeParam vol_pb;
		DTPBRec desktop_pb;
		FSSpec application;
		GetVolParmsInfoBuffer volinfo;
		HIOParam param_pb;

		/* Ç‹Ç∏ÉçÅ[ÉJÉãÉ{ÉäÉÖÅ[ÉÄÇ©ÇÁíTǵNjÇ∑ */

		param_pb.ioNamePtr = NULL;
		param_pb.ioBuffer = (Ptr) &volinfo;
		param_pb.ioReqCount = sizeof(volinfo);
		err = fnfErr; /* ÉfÉtÉHÉãÉgÇÃíl */
		vol_pb.ioNamePtr = NULL;
		for (vol_pb.ioVolIndex = 1;
		  PBHGetVInfoSync ((HParmBlkPtr) &vol_pb) == noErr;
		  vol_pb.ioVolIndex++) {
			param_pb.ioVRefNum = vol_pb.ioVRefNum;
			if (PBHGetVolParmsSync ((HParmBlkPtr)&param_pb) == noErr
			  && volinfo.vMServerAdr == 0) {
				desktop_pb.ioCompletion = NULL;
				desktop_pb.ioVRefNum = vol_pb.ioVRefNum;
				desktop_pb.ioNamePtr = NULL;
				desktop_pb.ioIndex = 0;
				if (PBDTGetPath (&desktop_pb) == noErr) {
					desktop_pb.ioFileCreator = app_creator_bytes;
					desktop_pb.ioNamePtr = application.name;
					if (PBDTGetAPPLSync (&desktop_pb) == noErr) {
						application.vRefNum = vol_pb.ioVRefNum;
						application.parID = desktop_pb.ioAPPLParID;
						err = noErr;
						break;
					}
				}
			}
		}

		/* éüÇ…ÉäÉÇÅ[ÉgÉ{ÉäÉÖÅ[ÉÄÇíTǵNjÇ∑ */

		if (err != noErr && use_remote_apps)
			for (vol_pb.ioVolIndex = 1;
			  PBHGetVInfoSync ((HParmBlkPtr) &vol_pb) == noErr;
			  vol_pb.ioVolIndex++) {
				param_pb.ioVRefNum = vol_pb.ioVRefNum;
				if (PBHGetVolParmsSync ((HParmBlkPtr) &param_pb) ==noErr
				  && volinfo.vMServerAdr != 0) {
					desktop_pb.ioCompletion = NULL;
					desktop_pb.ioVRefNum = vol_pb.ioVRefNum;
					desktop_pb.ioNamePtr = NULL;
					desktop_pb.ioIndex = 0;
					if (PBDTGetPath (&desktop_pb) == noErr) {
						desktop_pb.ioFileCreator = app_creator_bytes;
						desktop_pb.ioNamePtr = application.name;
						if (PBDTGetAPPLSync (&desktop_pb) == noErr) {
							application.vRefNum = vol_pb.ioVRefNum;
							application.parID = desktop_pb.ioAPPLParID;
							err = noErr;
							break;
						}
					}
				}
			}

		if (err != noErr)
			goto launch_the_document_termination;

		/* ÉpÉâÉÅÅ[É^Çïœä∑ǵNjÇ∑ */

		err = AECoerceDesc (&the_apple_event, typeAppParameters,
		      &parameter_desc);
		if (err != noErr) goto launch_the_document_termination;

		/* ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇ‹Ç∑ */

		launch_pb.launchBlockID = extendedBlock;
		launch_pb.launchEPBLength = extendedBlockLen;
		launch_pb.launchFileFlags = 0;
		launch_pb.launchControlFlags =
			launchContinue + launchNoFileFlags;
		launch_pb.launchAppSpec = &application;
		HLock ((Handle) parameter_desc.dataHandle);
		launch_pb.launchAppParameters =
			(AppParametersPtr) (*parameter_desc.dataHandle);
		err = LaunchApplication (&launch_pb);
		HUnlock ((Handle) parameter_desc.dataHandle);
	}

launch_the_document_termination:

	/* èIóπèàóù */

	if (the_alias != NULL)
	    DisposeHandle ((Handle) the_alias);
	AEDisposeDesc (&parameter_desc);
	AEDisposeDesc (&target_desc);
	AEDisposeDesc (&file_desc);
	AEDisposeDesc (&files_list);
	AEDisposeDesc (&the_apple_event);
	AEDisposeDesc (&the_reply);
	return err;
}

/* ÉTÉìÉvÉãÉ}ÉbÉsÉìÉOä÷êîÅBíPèÉÇ…ÉeÉLÉXÉgÉtÉ@ÉCÉãÇÇ∑Ç◊ǃClarisWorksÇ≈
äJÇ´Ç‹Ç∑ÅB */

void MyMapCreator (FSSpec *document, OSType type, OSType *creator)
{
	if (type == 'TEXT')
	*creator = 'BOBO'; /* ÉeÉLÉXÉgÉtÉ@ÉCÉãÇÕÇ∑Ç◊ǃClarisWorks
	ÅiÉNÉäÉGÅ[É^É^ÉCÉv = 'BOBO'ÅjÇ≈äJÇ≠ */
}

#ifdef powerc
QDGlobals qd;
#endif

void main (void)
{
	SFTypeList typeList;
	StandardFileReply reply;

	InitGraf (&qd.thePort);
	InitFonts ();
	InitWindows ();
	TEInit ();
	InitMenus ();
	InitDialogs (0);
	InitCursor ();
	StandardGetFile (NULL, -1, typeList, &reply);
	if (reply.sfGood)
		LaunchTheDocument (&reply.sfFile, false, MyMapCreator);
}


SendOpen.rÇÕ'SIZE'ÉäÉ\Å[ÉXÇÃRezÉRÅ[ÉhÇ≈Ç∑ÅBApple eventÇóòópÇ∑ÇÈèÍçáÇÕïKÇ∏isHighLevelEventAwareÇÉZÉbÉgǵǃâ∫Ç≥Ç¢ÅB
resource 'SIZE' (-1, purgeable) {
	reserved,
	acceptSuspendResumeEvents,
	reserved,
	canBackground,
	multiFinderAware,
	backgroundAndForeground,
	dontGetFrontClicks,
	ignoreChildDiedEvents,
	is32BitCompatible,
	isHighLevelEventAware,
	localAndRemoteHLEvents,
	isStationeryAware,
	dontUseTextEditServices,
	reserved,
	reserved,
	reserved,
	524288,
	524288
};



óvñÒ

System 7Ç≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÉtÉ@ÉCÉãÇäJÇ≠Ç…ÇÕíºê⁄Apple Event ManagerÇégǡǃOpenDocument Apple eventÇëóêMÇ∑ÇÈÇ©ÅALaunchApplication ()ÇåƒÇ—èoǵǃÅAǪÇÃàÍä¬ÇΔǵǃä‘ê⁄ìIÇ…OpenDocument Apple eventÇëóêMǵNjÇ∑ÅBDZÇÃÉeÉbÉNÉmÅ[ÉgÇÕÉTÉìÉvÉãÉRÅ[ÉhÇ≈è„ãLÇÃÇÊǧǻã@î\Çé¿åªÇ∑ÇÈï˚ñ@ÇíÒé¶ÇµÇ‹ÇµÇΩÅB

éQçlï∂å£


çXêVì˙: 1997 îN 11 åé 19 ì˙